package org.example.physics_engine.collision.contact;



import lombok.AllArgsConstructor;
import lombok.Data;
import org.example.physics_engine.geometry.Vector2d;

//代表两个PhysicsBody对象之间的接触点，该接触点拥有求解所需的信息。
@Data
@AllArgsConstructor
public final class SolvableContact {
    //世界坐标系下的接触点坐标
    private Vector2d p;

    //穿透深度
    private double depth;

    //接触点在PhysicBody1下的坐标
    private Vector2d p1;

    //接触点在PhysicBody2下的坐标
    private Vector2d p2;

    //PhysicBody1中心点到接触点的向量
    private Vector2d r1;

    //PhysicBody2中心点到接触点的向量
    private Vector2d r2;

    //法线冲量，用于施加碰撞冲量
    public double jn;

    //切线冲量，用于施加摩擦冲量
    public double jt;

    //位置冲量，用于位置求解器
    public double jp;

    //法线质量，用于施加碰撞冲量
    private double massN;

    //切线质量，用于施加摩擦冲量
    private double massT;

    //速度bias，缓解物体镶嵌问题
    public double vb;

    public SolvableContact(Vector2d point, double depth, Vector2d p1, Vector2d p2) {
        this.p = point;
        this.depth = depth;
        this.p1 = p1;
        this.p2 = p2;
    }
}
